package com.gan.simple_init.manager;

import com.gan.simple_init.common.exception.BusinessException;
import org.redisson.api.RRateLimiter;
import org.redisson.api.RateIntervalUnit;
import org.redisson.api.RateType;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * @author gbw
 * @date 2023/8/17
 * 专门用于提供限流服务
 */
@Service
public class RedisLimiterManager {

    @Resource
    private RedissonClient redissonClient;

    /**
     * 限流操作
     * @param key 区分不同的限流器，比如不同的用户 id 应该分别统计
     */
    public void doRateLimit(String key){
        RRateLimiter rateLimiter = redissonClient.getRateLimiter(key);
        // 每秒访问两次
        rateLimiter.trySetRate(RateType.OVERALL,2, 1,RateIntervalUnit.SECONDS);
        // 每秒请求一个令牌
        boolean canDo = rateLimiter.tryAcquire(1);
        if (!canDo){
            throw new BusinessException("请求过于频繁，请稍后再试!");
        }
    }
}
